این داده شامل اطلاعات اقامت و رزرو مهمانهای هتل مجید است. جزئیات این اطلاعات شامل تاریخ رزرو، تاریخ ورود و خروج، طول اقامت، هزینهی اتاق، نوع اتاق و حتی کشور مبدا مسافران است! چند رکورد از این داده را میبینیم: همانطور که در جدول مشخص است مورد دوم رزرو خود را کنسل کرده پس روز ورود و خروج و… برای این مورد ثبت نشده.
gt::gt(head(hotel_data))
| index | check_in_date | check_out_date | booking_date | Country | room_type_code | Status | stay_duration | price_pernight |
|---|---|---|---|---|---|---|---|---|
| 1 | 2013-07-24 | 2013-07-25 | 2013-06-06T14:24:10Z | Netherlands | D1 | Checked Out | 1 | 30.00 |
| 2 | 2013-06-07T00:09:08Z | Denmark | D1 | Cancelled | 0 | 28.99 | ||
| 3 | 2013-08-01 | 2013-08-03 | 2013-06-07T00:09:20Z | Switzerland | D2 | Checked Out | 2 | 25.38 |
| 4 | 2013-08-01 | 2013-08-03 | 2013-06-07T00:09:20Z | Switzerland | D2 | Checked Out | 2 | 29.60 |
| 5 | 2013-07-26 | 2013-07-27 | 2013-06-07T00:09:42Z | D3 | Checked Out | 1 | 29.90 | |
| 6 | 2013-07-26 | 2013-07-28 | 2013-06-07T00:11:38Z | Netherlands | C3 | Checked Out | 2 | 24.19 |
لیست زیر اقداماتی است که برای آشکار شدن! دادههای غلط انجام شد ۱- مقدار status و stay duration برای رزروهایی که کنسل شده یا نشده اند همخوانی داشته باشد ۲- فاصلهی تاریخ ورود و خروج برابر مدت اقامت باشد ۳- قیمت اتاق های مختلف دادهی پرت نداشته باشد ۴- تاریخ رزرو قبل از تاریخ ورود باشد
library(data.table)
hotel_data=data.table(hotel_data)
# no faulty data in stay duration
calculated_duration=hotel_data[str_c(ymd(check_out_date) - ymd(check_in_date))!=stay_duration]
# no faulty data in status/stay duration
cancelled_but_checked_out=
hotel_data[stay_duration==0 & Status=="Checked Out"]
#room type categorized to determine outlier
cat_hotel=hotel_data[ , room_cat :=str_extract(room_type_code,"[A-Z]")]
ggplot(cat_hotel,aes(x=month(ymd_hms(booking_date)),y=price_pernight,color=room_cat))+
geom_point(size=2)+
facet_wrap(~room_cat)
باور این که اتاق Bدر تمام طول این ۲ سال خالی بوده است دشوار است! پس یا این داده اشتباه وارد شده و هتل اصلا اتاق به این نوع ندارد یا اتاق بسیار بدیست!
checkin_before_booking=
hotel_data[ymd(floor_date(ymd_hms(hotel_data$booking_date),unit = "days"))> ymd(check_in_date)]
# remove faulty data
hotel_data=hotel_data[ymd(floor_date(ymd_hms(hotel_data$booking_date),unit = "days"))< ymd(check_in_date)+days(1)]
gt::gt(head(checkin_before_booking))
| index | check_in_date | check_out_date | booking_date | Country | room_type_code | Status | stay_duration | price_pernight | room_cat |
|---|---|---|---|---|---|---|---|---|---|
| 72 | 2013-07-02 | 2013-07-03 | 2013-07-03T01:01:44Z | D2 | Checked Out | 1 | 26.07 | D | |
| 155 | 2013-07-05 | 2013-07-06 | 2013-07-06T01:04:13Z | D1 | Checked Out | 1 | 29.00 | D | |
| 156 | 2013-07-05 | 2013-07-06 | 2013-07-06T01:04:15Z | D1 | Checked Out | 1 | 29.00 | D | |
| 157 | 2013-07-05 | 2013-07-06 | 2013-07-06T01:04:17Z | D1 | Checked Out | 1 | 29.00 | D | |
| 264 | 2013-07-09 | 2013-07-10 | 2013-07-10T01:48:50Z | France | D2 | Checked Out | 1 | 26.07 | D |
| 274 | 2013-07-09 | 2013-07-10 | 2013-07-10T07:22:29Z | Germany | D1 | Checked Out | 1 | 29.00 | D |
این جدول چند نمونه از مشتریان را نشان میدهد که بعد از وارد شدن و اتاق گرفتن، رزرو کردند! بسته به سیاستهای هتل این داده ها میتوانند غلط باشند
guests_origin=hotel_data[, .N, by=Country]
plot_ly(head(guests_origin[Country!=""],20), labels = ~Country, values = ~N, type = 'pie',
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(N, ' guests'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 1)),
showlegend = FALSE)
پراکندگی مهمانها در یک نقشهی جهان را نیز ببینیم
library(rgdal)
library(leaflet)
library(RColorBrewer)
world_spdf <- readOGR(
dsn= paste0(getwd(),"/world_shape_file/") ,
layer="TM_WORLD_BORDERS_SIMPL-0.3",
verbose=FALSE
)
# Clean the data object
world_spdf@data$POP2005[ which(world_spdf@data$POP2005 == 0)] = NA
world_spdf@data$POP2005 <-round(as.numeric(as.character(world_spdf@data$POP2005)) / 1000000,2)
world_spdf@data=guests_origin[world_spdf@data,on=c("Country"="NAME")]
# make pallete
mybins <- c(0,10,20,50,100,500,Inf)
mypalette <- colorBin( palette="YlOrBr", domain=world_spdf@data$n, na.color="transparent", bins=mybins)
# Prepare the text for tooltips:
mytext <- paste(
"Country: ", world_spdf@data$Country,"<br/>",
"Guests: ", world_spdf@data$N, "<br/>",
"Population: ", round(world_spdf@data$POP2005, 2),
sep="") %>%
lapply(htmltools::HTML)
# Final Map
leaflet(world_spdf) %>%
addTiles() %>%
setView( lat=10, lng=0 , zoom=2) %>%
addPolygons(
fillColor = ~mypalette(N),
stroke=TRUE,
fillOpacity = 0.9,
color="white",
weight=0.3,
label = mytext,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "13px",
direction = "auto"
)
) %>%
addLegend( pal=mypalette, values=~N, opacity=0.9, title = "Population (M)", position = "bottomleft" )
نرخ رزرو و ورود مهمانها را در طول سال میبینیم. به نظر میرسد که این هتل در ماههای پاییزی مشتریان بیشتری دارد
hotel_data=data.table(hotel_data)
booking_season=hotel_data[, .N ,by=month(ymd_hms(booking_date))]
booking_season[, Type:="Booking"]
check_in_data=hotel_data[check_in_date!=""]
check_in_season=check_in_data[, .N ,by=month(ymd(check_in_date))]
check_in_season[, Type:="Check in"]
ggplot(rbind(booking_season,check_in_season),aes(month,N,fill=Type))+geom_col()+
labs(title = "Booking and checking in rate whitin a year",y="number of customers")
hotel_data=data.table(hotel_data)
hotel_data[month(ymd(check_in_date)) %in% c(6,7,8), Season := "Summer"]
hotel_data[month(ymd(check_in_date)) %in% c(12,1,2), Season := "Winter"]
hotel_data[month(ymd(check_in_date)) %in% c(3,4,5), Season := "Spring"]
hotel_data[is.na(Season), Season := "Autumn"]
guest_per_season=hotel_data[, .N, by=Season]
plot_ly(na.omit(guest_per_season), labels = ~Season, values = ~N, type = 'pie',
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(N, ' guests'),
marker = list(colors = c("#6db356","orange","steelblue","pink"),
line = list(color = '#FFFFFF', width = 1)),
showlegend = FALSE)
hotel_data=read.csv("~/Downloads/data.csv")
hotel_data=data.table(hotel_data)
cancelled=hotel_data[Status=="Cancelled"]
cancelled[month(ymd_hms(booking_date)) %in% c(6,7,8), Season := "Summer"]
cancelled[month(ymd_hms(booking_date)) %in% c(12,1,2), Season := "Winter"]
cancelled[month(ymd_hms(booking_date)) %in% c(3,4,5), Season := "Spring"]
cancelled[is.na(Season), Season := "Autumn"]
cancelled_season=cancelled[, .N, by=Season]
plot_ly(na.omit(cancelled_season), labels = ~Season, values = ~N, type = 'pie',
textposition = 'inside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
hoverinfo = 'text',
text = ~paste(N, ' guests'),
marker = list(colors = c("#6db356","orange","steelblue","pink"),
line = list(color = '#FFFFFF', width = 1)),
showlegend = FALSE)
price_per_month=hotel_data[, .(room_price_mean=mean(price_pernight)), by=month(ymd(check_in_date))]
guests_per_month=hotel_data[, .N , by=month(ymd(check_in_date))]
price_per_month=na.omit(price_per_month)
guests_per_month=na.omit(guests_per_month)
price_demand=guests_per_month[price_per_month,on=c("month","month")]
ggplot(price_demand,aes(x=month))+
geom_line(aes(y=N/max(N),color="average price per night"))+
geom_line(aes(y=room_price_mean/max(room_price_mean),color="customers rate"))
guest_per_room=hotel_data[, .N , by= room_type_code]
ggplot(guest_per_room,aes(x=room_type_code,y=N))+geom_col(fill="steelblue")
avg_price_per_room=hotel_data[, .(avg_price=mean(price_pernight)) , by= room_type_code]
ggplot(avg_price_per_room,aes(x=room_type_code,y=avg_price))+geom_col(fill="pink")
ppn_summarise=cat_hotel[, keyby = .(room_cat),
.(avg = mean(price_pernight),std=sd(price_pernight))]
gt::gt(ppn_summarise)
| room_cat | avg | std |
|---|---|---|
| A | 44.46390 | 11.112842 |
| B | 39.99000 | NA |
| C | 27.40846 | 2.867252 |
| D | 25.73160 | 1.645656 |
در این قسمت میخواهیم به پارامترهای موثر در داده اشاره کنیم. اگر به نمودارهایی که کشیدیم توجه کنیم، میبینیم که محور اصلی بسیاری از این نمودارها به نوع اتاق وابسته بود. در داشبورد نیز میتوانیم ببینیم که تقریبا قیمت هر اتاق cوd ثابت است ولی قیمت اتاقهای Aمتغیر است.
به نمودارهای میانگین قیمت هر اتاق و نمودار عرضه و تقاضا نیز میتوان اشاره کرد که هم اهمیت پارامتر نوع اتاق و هم اهمیت پارامتر هزینهی اتاق را مشخص میکند
در بین پارامترهایی که تاریخی را مشخص میکنند به نظر زمان ورود از اهمیت بیشتری برخوردار است چون وضعیت هتل و تقاضا را نشان میدهد همچنین توزیع تقاضا در ماهها یا فصلهای سال را با همین پارامتر میسنجیم
پارامتری که کشور مبدا را مشخص میکند میتواند برای تعیین جامعهی هدف تبلیغات میتواند موثر باشد. وضعیت کنسلی نیز